home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / covern.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  4KB  |  176 lines

  1. /* 左右のカバーを開けて斜め弾 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13.  
  14. #define PALET_MAIN    0x0600
  15.  
  16. static short EnemyMoveCoverN (ENEMY *);
  17. static void EnemyTiniCoverN (ENEMY *);
  18.  
  19.  
  20. void EnemyInitCoverN (ENEMY * p)
  21. {
  22.     /* 左右どちらから出現したか */
  23.     if (SHORT_LX < 144)
  24.         p->vx = 8192;
  25.     else
  26.         p->vx = -8192;
  27.     p->vy = 2 * 65536;
  28.     p->hit_px = 24;
  29.     p->hit_py = 16;
  30.     p->hit_sx = 24;
  31.     p->hit_sy = 16;
  32.     p->hit_cx = 6;
  33.     p->damage = 0;
  34.     p->flash = 0;
  35.     p->hp = 50;
  36.     p->pt = obj_covern;
  37.     p->seq = 0;
  38.     p->core_pt = sp_core01;
  39.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  40.     p->func_enemy_move = EnemyMoveCoverN;
  41.     p->func_enemy_tini = EnemyTiniCoverN;
  42. }
  43.  
  44.  
  45.  
  46. static short EnemyMoveCoverN (ENEMY * p)
  47. {
  48.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  49.     p->x = (p->lx += p->vx) >> 16;
  50.     p->y = (p->ly += p->vy) >> 16;
  51.  
  52.     switch (p->seq) {
  53.  
  54.     case 0:
  55.         if (p->y > 48)
  56.             p->seq++;
  57.         break;
  58.  
  59.     case 1:
  60.         if (p->vy > 16384)
  61.             p->vy -= 4096;
  62.         else
  63.             p->seq++;
  64.         break;
  65.  
  66.         /* カバーを開ける */
  67.     case 2:
  68.         p->pt++;
  69.         if (p->pt == obj_covern + 14) {    /* カバー開ききったら */
  70.             p->seq++;
  71.             p->s_work2 = 0;
  72.             p->s_work3 = 5;    /* 斜め弾速度初期値 */
  73.             SoundSetSE (SE_LOCK);
  74.             break;
  75.         }
  76.         break;
  77.  
  78.         /* カバーが開いたので弾を撃つ */
  79.     case 3:
  80.         /* 攻撃処理 */
  81.         p->s_work2++;
  82.         /* 斜め弾 */
  83.         switch (p->s_work2) {
  84. #define INTERVAL2    5
  85.         case INTERVAL2 * 1:
  86.         case INTERVAL2 * 2:
  87.         case INTERVAL2 * 3:
  88.         case INTERVAL2 * 4:
  89.         case INTERVAL2 * 5:
  90.         case INTERVAL2 * 6:
  91.             EshotInit (ESHOT_NRG02, p->x + 16, p->y + 1, p->s_work3, 64 - 8, 0);
  92.             EshotInit (ESHOT_NRG02, p->x - 16, p->y + 1, p->s_work3, 64 + 8, 0);
  93.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  94.             p->s_work3 += 2;
  95.             break;
  96.         case INTERVAL2 * 7:
  97.             p->seq++;
  98.             p->s_work2 = 0;
  99.             break;
  100.         default:
  101.             break;
  102.         }
  103.         break;
  104.  
  105.     case 4:        /* カバーを閉めて赤くなる */
  106.         p->s_work2++;
  107.         if (p->s_work2 > 10) {
  108.             if (p->pt > obj_covern) {
  109.                 p->pt--;
  110.             } else {
  111.                 /* 閉まりきったら */
  112.                 p->core_info = PALET_CORE_RED | PRIORITY_BOSS;
  113.                 SoundSetSE (SE_LOCK);
  114.                 p->seq++;
  115.             }
  116.         }
  117.         break;
  118.  
  119.         /* 撤退 */
  120.     case 5:
  121.         if (p->vy > -1 * 65536)
  122.             p->vy -= 4096;
  123.         /* 画面外に出たら消去 */
  124.         if (SHORT_LY < -32)
  125.             return (-1);    /* 消去 */
  126.         break;
  127.     }
  128.  
  129.     /* 自機ショットに当たった時の処理 */
  130.     if (p->damage) {
  131.         if (p->damage_core) {
  132.             SoundSetSE (SE_CORE_DAMAGE);
  133.             p->info = PALET_RED | PRIORITY_BOSS;
  134.             p->damage_core = 0;
  135.         } else {
  136.             SoundSetSE (SE_DAMAGE);
  137.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  138.         }
  139.         if ((p->hp -= p->damage) <= 0) {
  140.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  141.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  142.             if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS))
  143.                 EffectInit (EFFECT_POINTS_RED, POINTS_1000, p->x, p->y);
  144.             else
  145.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_500, p->x, p->y);
  146.             if (disp_level == DISP_LEVEL_HIGH)
  147.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  148.             return (-1);    /* 消去 */
  149.         }
  150.         p->damage = 0;
  151.         p->flash = TIMER_FLASH_DAMAGE;
  152.     } else {
  153.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 30)) {
  154.             p->info = PALET_RED | PRIORITY_BOSS;
  155.             if (p->flash > TIMER_FLASH_NORMAL)
  156.                 p->flash = 0;
  157.         } else {
  158.             p->info = PALET_MAIN | PRIORITY_BOSS;
  159.         }
  160.     }
  161.     xobj_set_st (p);
  162.  
  163.     /* コアの表示 */
  164.     p->core_x = p->x - 8;    /* コアの中心は (-8,-12) ドットずれる */
  165.     p->core_y = p->y - 12;
  166.     xsp_set_st (&(p->core_x));
  167.  
  168.     return (0);
  169. }
  170.  
  171.  
  172.  
  173. static void EnemyTiniCoverN (ENEMY * p)
  174. {
  175. }
  176.